package DEEPERsource.DEEPERsource.source.machinelearning;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LibSVM {
	private static Log _log = LogFactory.getLog(LibSVM.class);

	/*
	 * Usage: svm-train [options] training_set_file [model_file]
		options:
		-s svm_type : set type of SVM (default 0)
			0 -- C-SVC
			1 -- nu-SVC
			2 -- one-class SVM
			3 -- epsilon-SVR
			4 -- nu-SVR
		-t kernel_type : set type of kernel function (default 2)
			0 -- linear: u'*v
			1 -- polynomial: (gamma*u'*v + coef0)^degree
			2 -- radial basis function: exp(-gamma*|u-v|^2)
			3 -- sigmoid: tanh(gamma*u'*v + coef0)
			4 -- precomputed kernel (kernel values in training_set_file)
		-d degree : set degree in kernel function (default 3)
		-g gamma : set gamma in kernel function (default 1/k)
		-r coef0 : set coef0 in kernel function (default 0)
		-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
		-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
		-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
		-m cachesize : set cache memory size in MB (default 100)
		-e epsilon : set tolerance of termination criterion (default 0.001)
		-h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1)
		-b probability_estimates: whether to train an SVC or SVR model for probability estimates, 0 or 1 (default 0)
		-wi weight: set the parameter C of class i to weight*C in C-SVC (default 1)
		-v n: n-fold cross validation mode

		The k in the -g option means the number of attributes in the input data.

		option -v randomly splits the data into n parts and calculates cross
		validation accuracy/mean squared error on them.

	 */
	public void runTrain(String cmdLine, String trainData, String model) {
		try {
			_log.debug("start training");
			//Runtime.getRuntime().exec("resource/svm/svmtrain.exe " + cmdLine + " " + trainData+ " " + model);
			Process p = Runtime.getRuntime().exec("resource/svm/svmtrain.exe "+cmdLine+" "+trainData+" "+model);
			BufferedReader output = new BufferedReader(new InputStreamReader(p.getInputStream()));
			String line;
			while ((line = output.readLine()) != null)
				_log.info(line);
		    p.waitFor();
			_log.debug("end training");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/*
	 * Usage: svm-predict [options] test_file model_file output_file 
	 * options: 
	 * 	-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0); 
	 * 		for one-class SVM only 0 is supported model_file is the
	 * 	model file generated by svm-train. 
	 * 	test_file is the test data you want to predict. 
	 * svm-predict will produce output in the output_file.
	 */
	public void runTest(String cmdLine, String test, String model, String out){
		try {
			_log.debug("start test");
			//ProcessBuilder launcher = new ProcessBuilder("resource/svm/svmpredict.exe "+cmdLine+" "+test+" "+model+" "+out);
			Process p = Runtime.getRuntime().exec("resource/svm/svmpredict.exe "+cmdLine+" "+test+" "+model+" "+out);
			BufferedReader output = new BufferedReader(new InputStreamReader(p.getInputStream()));
			String line;
			while ((line = output.readLine()) != null)
				_log.info(line);
		    p.waitFor();
			_log.debug("end test");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public void resultsProcessor(){
		
	}
}
